package com.ms.mybaitisdemo.util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * SqlSessionFactory是创建SqlSession的对象
 * 
 * 注意：
 * 
 * （1）SqlSessionFactory类似于java.sql.Connection，线程安全，所以最佳实践使用单例。
 * 
 * （2）SqlSession类似于java.sql.Statement(ps)，线程不安全的，所以每次使用的时候，都需要创建。使用完以后，要关闭。
 * 
 * （3）通过SqlSessionFactoryBuilder对象，创建SqlSessionFactory。
 * SqlSessionFactoryBuilder类似java.sql.DriverManager。
 * 
 * 备注：
 * 
 * （1）SqlSessionFactoryBuilder通过SqlSessionFactoryBuilder().build(resourcePath)，
 * 来创建SqlSessionFactory对象
 * （2）ResourcePath中对应的配置文件，（mybatis-config.xml）中，定义了相关的数据库了连接对象
 * ，例如：Url、DriverName、UserName、Password （3）使用Resource对象，来加载此配置文件。
 * 
 * 备注： （1）使用“懒人包”，获取log对象 （2）单例模式 -- 在应用程序中，该对象只会被创建一次（静态对象）。 --
 * 例如SqlSessionFactory线程安全的。所以我们创建一次就可以了。 --
 * 如何创建一个单例：首先，构造函数一定是私有的。第二，你需要提供一个静态对象，获取改示例。 -- 一般单例有二种模式：懒汉式和勤汉式
 * 
 * @author Administrator
 * 
 */
@Slf4j
public class SqlSessionFactoryUtil {

	private SqlSessionFactory sqlSessionfactory = null;
	private SqlSessionFactory sqlSessionfactory2 = null;

	/**
	 * 采用的懒汉式
	 */
	private static SqlSessionFactoryUtil sqlSessionFactoryUtil = null;

	/**
	 * 第一步：通过SqlSessionFactoryBuilder，创建sqlSessionfactory对象。
	 */
	private SqlSessionFactoryUtil() {

		Reader reader = null;
		
		//模拟加载第二个数据源
		Reader reader2 = null;

		try {
			reader = Resources.getResourceAsReader("mybatis-config.xml");
			sqlSessionfactory = new SqlSessionFactoryBuilder().build(reader, "dev");
			reader.close();
			
			reader2 = Resources.getResourceAsReader("mybatis-config.xml");
			sqlSessionfactory2 = new SqlSessionFactoryBuilder().build(reader2, "pro");
			reader2.close();

			
		} catch (IOException e) {
			log.error("读取Mybaitis配置文件异常！ ", e);
		}

		
	}
	
	/**
	 * 通过懒汉式，创建sqlSessionFactoryUtil示例
	 * @return
	 */
	public synchronized static SqlSessionFactoryUtil getInstance() {

		if (sqlSessionFactoryUtil == null) {
			sqlSessionFactoryUtil = new SqlSessionFactoryUtil();
		}

		return sqlSessionFactoryUtil;

	}

	public SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionfactory;
	}
	
	public SqlSessionFactory getSqlSessionFactory2() {
		return sqlSessionfactory2;
	}

}
